package com.neusoft.proxy.two;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理： 实现InvocationHandler接口
 * 每个动态代理的实例都有一个相关联的接口，当动态代理实现对象执行方法的时候，就会
 * 调用InvocationHandler中的invoke方法进行增强
 */
public class SuperMarketInvocationHandler implements InvocationHandler {
    /**
     * 被代理对象
     */
    private SuperMarketAction superMarketAction;

    public SuperMarketInvocationHandler(SuperMarketAction superMarketAction ) {
        this.superMarketAction = superMarketAction;
    }

    /**
     * 代理对象的增强方式
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理调用委托类方法之前(开始事务)");
        Object result = method.invoke(superMarketAction,args); //切入点
        System.out.println("代理调用委托类方法之后(提交事务)");
        return result;
    }

    /**
     * 生于生成代理对象
     * public static Object newProxyInstance(ClassLoader loader,
     *                                       Class<?>[] interfaces,
     *                                       InvocationHandler h)
     *                                throws IllegalArgumentException
     * 参数说明：
     *  loader-被代理对象类的加载器
     *  interfaces-被代理对象的接口列表
     *  h- 指派方法调用的的处理程序(核心处理程序)
     * @return
     */
    public Object createProxy() {
        return Proxy.newProxyInstance(superMarketAction.getClass().getClassLoader(),superMarketAction.getClass().getInterfaces(),this);
    }
}
